home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Ham Radio 2000 #2
/
Ham Radio 2000 - Volume 2.iso
/
HAMV2
/
TCP_IP
/
TNOS230S
/
X.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-08-18
|
7KB
|
300 lines
#include "global.h"
#include "commands.h"
#include "mbuf.h"
#include "netuser.h"
#include "tcp.h"
#include "domain.h"
#include "x.h"
#include "stats.h"
#if !defined(_lint)
static char rcsid[] OPTIONAL = "$Id: x.c,v 1.17 1997/08/19 01:19:22 root Exp root $";
#endif
#ifdef XSERVER
#ifdef HOLDMONITOR
extern int HOLDindicator;
#endif
#ifdef ALERTMONITOR
extern int ALERTindicator;
#endif
static struct xcontrol *Xclients = NULLX;
static struct xhost *Xhosts = NULLXHOST;
#ifdef ALLSERV
extern int ScreenedCall;
extern char *ScreenedCaller;
#endif
static int Sx = -1;
static const char xlistener[] = "Xwindows listener";
static const char xserver[] = "Xwindows server";
void variable_expansion (struct mbuf **bp);
#ifdef CONVERS
int CountConfUsers (void);
#endif
extern struct cmds Cmds[];
extern char *NextCmdMsg;
extern short NextCmd;
static int xhostlookup (char *name);
static void xserv (int s, void *ds, void *p);
static char *xhostchk (int s);
static int doxhosts (int argc,char *argv[],void *p);
static int doxconnected (int argc,char *argv[],void *p);
/* xwindows subcommand table */
static struct cmds Xtab[] = {
{ "connected", doxconnected, 0, 0, NULLCHAR },
{ "hosts", doxhosts, 0, 0, NULLCHAR },
{ NULLCHAR, NULL, 0, 0, NULLCHAR }
};
int
doxwindows (int argc, char *argv[], void *p)
{
return subcmd(Xtab,argc,argv,p);
}
static int
doxhosts (int argc, char *argv[], void *p OPTIONAL)
{
struct xhost *x;
int i;
if(argc == 1) { /*just list them*/
for (x = Xhosts; x != NULLXHOST; x = x->next)
tprintf("%s ", x->host);
tputc('\n');
} else { /* add some xhost(s) */
for(i = 1; i < argc; i++) {
x = callocw(1,sizeof(struct xhost));
x->host = strdup(argv[i]);
/* add to list */
x->next = Xhosts;
Xhosts = x;
}
}
return 0;
}
static int
doxconnected (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
{
struct xcontrol *x;
for (x = Xclients; x != NULLX; x = x->next)
tprintf("%s ", x->host);
tputc('\n');
return 0;
}
int
xserver0 (int argc OPTIONAL, char *argv[] OPTIONAL, void *p OPTIONAL)
{
return (deleteserver (&Sx));
}
int
xserver1 (int argc, char *argv[], void *p OPTIONAL)
{
int port = IPPORT_X;
if (argc > 1) {
port = atoi (argv[1]);
tprintf ("Starting Xserver on port %d\n", port);
}
return (installserver (argc, argv, &Sx, xlistener, port,
INADDR_ANY, xserver, xserv, 512, NULL));
}
static void
xserv (int s, void *ds OPTIONAL, void *p OPTIONAL)
{
struct mbuf *bp;
int datalen;
struct xcontrol *x;
x = (struct xcontrol *) mallocw (sizeof (struct xcontrol));
if (x == NULLX)
return;
(void) sockowner(s,Curproc); /* We own it now */
/* Secede from the parent's sockets, and use the network socket that
* was passed to us for both input and output. The reference
* count on this socket will still be 1; this allows the domboxbye()
* command to work by closing that socket with a single call.
* If we return, the socket will be closed automatically.
*/
close_s(Curproc->output);
close_s(Curproc->input);
Curproc->output = Curproc->input = x->s = s;
if ((x->host = xhostchk (s)) == NULLCHAR) {
usprintf (s,"TNOS XSession denied! No permission........\n");
log (s, "XServer access denied!");
} else {
log(s, "open Xserver");
#ifdef STATS_USE
STATS_adduse (1);
MiscUsers++;
#endif
x->txstatusinfo = 0;
x->next = Xclients;
Xclients = x;
netPrompt();
/* Process input on the connection */
for ( ; ; ) {
if((datalen = socklen(s,0)) > 0) {
if (recv_mbuf(s,&bp,0,NULLCHAR,0) == -1)
break;
variable_expansion (&bp);
if (!strnicmp ((char *)bp->data, "ex", 2))
break;
if (!strnicmp ((char *)bp->data, "bbs", 2)) {
tprintf (SCMD"start_bbs_session"ECMD);
continue;
}
if (!strnicmp ((char *)bp->data, "txstat", 6)) {
char *cp;
cp = skipnonwhite ((char *)bp->data);
cp = skipwhite (cp);
x->txstatusinfo = atoi(cp);
xnotify (X_ALL);
} else
(void)cmdparse(Cmds, (char *)bp->data, NULL);
free_p(bp);
netPrompt();
} else if(datalen < 0)
break;
if (!datalen)
(void) kpause (500);
}
#ifdef STATS_USE
MiscUsers--;
#endif
free (x->host);
if (Xclients == x)
Xclients = x->next;
else {
struct xcontrol *xp;
for (xp = Xclients; xp != NULLX; xp = xp->next) {
if (xp->next == x) {
xp->next = x->next;
break;
}
}
}
}
close_s(s);
s = -1;
}
void
xnotify (int which)
{
struct xcontrol *x;
for (x = Xclients; x != NULLX; x = x->next) {
if (!x->txstatusinfo)
continue;
if (which & X_BBS)
usprintf (x->s, SCMD"set STATbbs %d"ECMD, BbsUsers);
#ifdef CONVERS
if (which & X_CONF)
usprintf (x->s, SCMD"set STATconf %d"ECMD, CountConfUsers());
#endif
if (which & X_FTP)
usprintf (x->s, SCMD"set STATftp %d"ECMD, FtpUsers);
if (which & X_TUT)
usprintf (x->s, SCMD"set STATtut %d"ECMD, Tutored);
#ifdef ALLSERV
if (which & X_SCREEN) {
usprintf (x->s, SCMD"set STATscreencaller %s"ECMD,
(ScreenedCaller) ? ScreenedCaller : "(none)");
usprintf (x->s, SCMD"set STATscreen %d"ECMD, ScreenedCall);
}
#endif
#ifdef HOLDMONITOR
if (which & X_HOLD)
usprintf (x->s, SCMD"set STAThold %d"ECMD, HOLDindicator);
#endif
#ifdef ALERTMONITOR
if (which & X_ALERT)
usprintf (x->s, SCMD"set STATalert %d"ECMD, ALERTindicator);
#endif
if (which & X_MSG) {
char *cp, *cp2;
cp = strdup ((NextCmd) ? NextCmdMsg : "");
while ((cp2 = strpbrk (cp, "[]{}")) != NULLCHAR)
*cp2 = ' ';
usprintf (x->s, SCMD"set STATmsg { %s}"ECMD, cp);
free (cp);
}
}
}
static char *
xhostchk (int s)
{
struct sockaddr fsocket;
int i, trans;
char *retval = NULLCHAR;
char *cptr, *cptr2;
i = SOCKSIZE;
trans = DTranslate; /* Save IP address translation state */
DTranslate = 0; /* Force output to be numeric IP addr*/
if (getpeername(s,(char *)&fsocket,&i) != -1) {
cptr = psocket(&fsocket);
if ((cptr2 = strchr(cptr, ':')) != NULLCHAR)
*cptr2 = 0;
if (xhostlookup (cptr))
retval = strdup (cptr);
}
DTranslate = trans; /* Restore original state */
return retval;
}
static int
xhostlookup (char *name)
{
struct xhost *x;
for (x = Xhosts; x != NULLXHOST; x = x->next) {
if (!stricmp (x->host, name))
return 1;
}
return 0;
}
#endif /* XSERVER */